home *** CD-ROM | disk | FTP | other *** search
/ Scene Storm / Scene Storm - Volume 1.iso / coding / c / amiexpress / source / ae / code / ax3.00 / serial.c < prev    next >
Encoding:
C/C++ Source or Header  |  1980-01-03  |  5.1 KB  |  234 lines

  1. #include "bbs.h"
  2.  
  3. //extern int TimeOut, SerEcho, Local;   not used
  4. LONG GetBufSize(void);
  5. // UBYTE GUB1;
  6. UBYTE serin[20];
  7.  
  8. struct CIA *cia_ptr;
  9.  
  10. int OpenSerial(ULONG Baud, UBYTE DataLen, UBYTE StopBits)
  11. {
  12. // if(SEROUT) return(FALSE);  (RTS) already open
  13.  SEROUT=0;
  14. if(Cmds->SerDev[0]!='\0')
  15.     {
  16.     cia_ptr = (struct CIA *)0xBFD000;
  17.     if(ReadSerPort = CreatePort(NULL,0L))
  18.         {
  19.         if(ReadSerReq  = (struct IOExtSer *)CreateExtIO(ReadSerPort,(long)sizeof(struct IOExtSer)))
  20.             {
  21.             if(WriteSerPort= CreatePort(NULL,0L))
  22.                 {
  23.                 if(WriteSerReq = (struct IOExtSer *)CreateExtIO(WriteSerPort,(long)sizeof(struct IOExtSer)))
  24.                     {
  25.                     ReadSerReq->io_SerFlags = (SERF_SHARED|SERF_XDISABLED|SERF_RAD_BOOGIE|(!Cmds->AcLvl[LVL_VARYING_LINK_RATE]*SERF_7WIRE));
  26. retry:
  27.                     if(!(GI1 = OpenDevice(Cmds->SerDev,(ULONG)Cmds->SerDevUnit,ReadSerReq,(ULONG)0L)))
  28.                         {
  29.                         Delay((long)10L);
  30.  
  31.                         *WriteSerReq=*ReadSerReq;
  32.                         WriteSerReq->IOSer.io_Message.mn_ReplyPort=WriteSerPort;
  33.  
  34.                         ReadSerReq->io_Baud           = Baud;
  35.                         ReadSerReq->io_ReadLen        = DataLen;
  36.                         ReadSerReq->io_WriteLen       = DataLen;
  37.                         ReadSerReq->io_SerFlags       = (SERF_SHARED|SERF_XDISABLED|SERF_RAD_BOOGIE|(!Cmds->AcLvl[LVL_VARYING_LINK_RATE]*SERF_7WIRE));
  38.                         ReadSerReq->io_StopBits       = StopBits;
  39.                         ReadSerReq->io_CtlChar        = 0x11130000L;
  40.                         ReadSerReq->io_RBufLen        = 16384L;
  41.                         ReadSerReq->IOSer.io_Command  = SDCMD_SETPARAMS;
  42.                         DoIO(ReadSerReq);
  43.                         SerCharSig=1L<<ReadSerPort->mp_SigBit;
  44.  
  45.                         WriteSerReq->IOSer.io_Command = CMD_WRITE;
  46.  
  47.                         ReadSerReq->IOSer.io_Length   = 1;
  48.                         ReadSerReq->IOSer.io_Data     = (APTR)serin;
  49.                         ReadSerReq->IOSer.io_Command  = CMD_READ;
  50.                         SendIO(ReadSerReq);
  51.                         SEROUT=1;
  52.                         return(FALSE);
  53.                         }
  54.                               else
  55.                               {
  56.                                 Delay(30L); goto retry;
  57.                               }
  58.                     DeleteExtIO(WriteSerReq);
  59.                     }
  60.                 DeletePort(WriteSerPort);
  61.                 }
  62.             DeleteExtIO(ReadSerReq);
  63.             }
  64.         DeletePort(ReadSerPort);
  65.         }
  66.     return(TRUE);
  67.     }
  68. return(FALSE);
  69. }
  70.  
  71. void LineReset(void);
  72. int CheckCarrier(void)
  73. {
  74. int stat;
  75. int stat2=0;
  76. //char temp[50];
  77.  stat=1;
  78.  if(SEROUT) {
  79.         WriteSerReq->IOSer.io_Command = SDCMD_QUERY;
  80.      stat2=DoIO(WriteSerReq);
  81.         stat = WriteSerReq->io_Status & CIAF_COMCD;
  82. WriteSerReq->IOSer.io_Command = CMD_WRITE;
  83.      if(Sopt->A2232 && !transfering)
  84.      if(WriteSerReq->io_Status && !stat){ LineReset();/* sprintf(temp,"Serial Error %d\n",WriteSerReq->io_Status); ErrorLog(temp);*/}
  85.      
  86.     }else return(1);
  87. return(stat?FALSE:TRUE);
  88. }
  89.  
  90. void LineReset(void)
  91. {
  92.       ReadSerReq->IOSer.io_Command = CMD_RESET;
  93.         DoIO(ReadSerReq);
  94.      ReadSerReq->IOSer.io_Command = CMD_READ;
  95.         SendIO(ReadSerReq);
  96. }
  97. void PurgeLine(void)
  98. {
  99.  if(SEROUT)    {
  100.      AbortIO(ReadSerReq);
  101.         WaitIO(ReadSerReq);
  102.      ReadSerReq->IOSer.io_Command = CMD_CLEAR;
  103.         DoIO(ReadSerReq);
  104.      ReadSerReq->IOSer.io_Command = CMD_READ;
  105.         SendIO(ReadSerReq);
  106.     }
  107. }
  108.  
  109. void RePurge(void)
  110. {
  111.  
  112.    while(CheckSer())
  113.    {
  114.      WaitIO(ReadSerReq);
  115.    ReadSerReq->IOSer.io_Command = CMD_READ;
  116.      SendIO(ReadSerReq);
  117.    }
  118. }
  119. void PurgeLineEnd(void)
  120. {
  121. long result;
  122.  
  123.  if(SEROUT)    {
  124.      result=CheckIO(ReadSerReq);
  125.         if(!result)    {
  126.          AbortIO(ReadSerReq);
  127.         }
  128.         WaitIO(ReadSerReq);
  129.      ReadSerReq->IOSer.io_Command = CMD_CLEAR;
  130.         DoIO(ReadSerReq);
  131.     }
  132. }
  133.  
  134. void PurgeLineStart(void)
  135. {
  136.  if(SEROUT)    {
  137.      ReadSerReq->IOSer.io_Command = CMD_CLEAR;
  138.         DoIO(ReadSerReq);
  139.      ReadSerReq->IOSer.io_Command = CMD_READ;
  140.         SendIO(ReadSerReq);
  141.     }
  142. }
  143.  
  144. extern int Dropped_Hook;
  145. void Reset_System(UBYTE Yes)
  146. {
  147.  extern BOOL TrueReset;
  148. IO_Flags[IOFLAG_KBD_IN]=1;
  149. IO_Flags[IOFLAG_SER_IN]=1;
  150. if(IO_Flags[IOFLAG_FIL_IN])
  151.     {
  152.     IO_Flags[IOFLAG_FIL_IN]=0;
  153.     }
  154. IO_Flags[IOFLAG_SCR_OUT]=0;
  155. IO_Flags[IOFLAG_SER_OUT]=0;
  156. if(Cmds->SerDev[0]!='\0')
  157. {
  158.   
  159.    // if(!Dropped_Hook)
  160.    // {
  161.      PurgeLine();
  162.      DropDTR();
  163.    // }else Dropped_Hook=0;
  164.     Delay(25L);
  165.   if(Cmds->AcLvl[LVL_VARYING_LINK_RATE]==1)
  166.     {
  167.     SetBaud(Cmds->OpeningBaud);
  168.     Delay(25L);
  169.     }
  170. IntDoReset(Cmds->MReset);
  171. if(TrueReset)
  172.     {
  173.      Delay(30L);
  174.     SerPutStr("ATZ\r");
  175.     LineInput("",GSTR3,50,5);
  176.     if(!(strnicmp(GSTR3,"ATZ",3)))
  177.         {
  178.         Delay(50L);//LineInput("",GSTR3,50,5);
  179.         }
  180.     ReInitModem();
  181.     IntDoReset(Cmds->MReset);
  182.     }
  183.  Delay(30L);
  184.  if(Sopt->Toggles[11]) return;
  185.  if(Sopt->Toggles[12]) { RePurge(); return; }
  186.  PurgeLine();
  187. }
  188.  
  189. }
  190. void IntDoReset(char *s)
  191. {
  192.  UWORD loop;
  193.  register int i;
  194.  i=strlen(s);
  195.  for(loop=0; loop<i; loop++)    { 
  196.         if(s[loop]=='~')
  197.          Delay(110L);
  198.      else {
  199.          if(s[loop]=='|'){
  200.              SerPutStr("\r"); }
  201.          else
  202.              SerPutChar(&s[loop]);
  203.         }
  204.     }
  205.  SerPutStr("\r");
  206.  //LineInput("",GSTR3,50,10);
  207. }
  208.  
  209. void ReInitModem(void)
  210. {
  211.  DropDTR();
  212.  Delay(20L);
  213.  IntDoReset(Sopt->OffHook);
  214.  Delay(60L);
  215.  SerPutStr(Cmds->MInit);
  216.  SerPutStr("\r");
  217.  Delay(60L);
  218.  PurgeLine();
  219. }
  220. void SetBaud(LONG rate)
  221. {
  222.  if(SEROUT)    {
  223.         PurgeLine();                 /* Flush recieve buffer */
  224.         AbortIO(ReadSerReq);         /* Abort PurgeLine's read req */
  225.         WaitIO(ReadSerReq);
  226.         ReadSerReq->io_Baud = rate;  /* set baud rate */
  227.         ReadSerReq->IOSer.io_Command = SDCMD_SETPARAMS;
  228.         DoIO(ReadSerReq);
  229.  
  230.         ReadSerReq->IOSer.io_Command = CMD_READ; /* Restart read req */
  231.         SendIO(ReadSerReq);
  232.     }
  233. }
  234.